///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: signal.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 系统日志
//* QQ:	2085827949
//**********************************************************************/
#include "user.h"

User * currentUser = NULL;   //当前登录的用户
LinkList* userList = NULL; //用户链表


/*********************************************************************************
** 函数名称: showeUserInfo
** 功能描述: 显示用户信息
** 输入参数: user: 用户结构体.
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/
void showeUserInfo(User* user)
{
    //system("clear");
    isNull(user,"showeUserInfo Err",);
    printf("**************************** 用户信息 ****************************\r\n");
    printf("    姓名：%s\r\n",user->name);
    printf("    编号：%s\r\n",user->number);
    printf("    VIP：%d\r\n",user->isVip);
    printf("    余额：%d\r\n",user->balance);
    printf("    权限：%d\r\n",user->limit);
    printf("    航班：%s\r\n",user->flight_num);
    printf("    班期：%s\r\n",user->date);
    printf("******************************************************************\r\n");
}



/*********************************************************************************
** 函数名称: decodeUser
** 功能描述: 解析用户
** 输入参数: src: 用户字符串.
** 输出参数: None.
** 返回参数: .
**********************************************************************************/
int decodeUser(char* src)
{
    int i = 0;
    int offset = 0;
    int len =-1;
    User * user =NULL;

    char limit[10] = {0};
    char isVip[10] = {0};
    char balance[10] = {0};

    isNull(src,,-1);

    user = (User*)calloc(sizeof(User),1);
    isNull(user,"decodeUser Err",-1);
    decodeItem(&src[offset],user->name,',',&len);       offset+=len+1;
    decodeItem(&src[offset],user->passwd,',',&len);     offset+=len+1;
    decodeItem(&src[offset],user->number,',',&len);     offset+=len+1;
    decodeItem(&src[offset],isVip,',',&len);            offset+=len+1;
    decodeItem(&src[offset],limit,',',&len);            offset+=len+1;
    decodeItem(&src[offset],balance,',',&len);          offset+=len+1;
    
    decodeItem(&src[offset],user->flight_num,',',&len); offset+=len+1;
    decodeItem(&src[offset],user->date,',',&len); 

    user->limit = atoi(limit);
    user->isVip = atoi(isVip);
    user->balance = atoi(balance);
    
    addUser(user);
    // showeUserInfo(user);
    
}


/*********************************************************************************
** 函数名称: decodeUserFile
** 功能描述: 解析用户文件
** 输入参数: src: 用户文件.
** 输出参数: None.
** 返回参数: .
**********************************************************************************/
int decodeUserFile(char* src)
{
    char* head =NULL;
    char* end =NULL;
    char* data = NULL;

    head = data = fileRead(src);
    isNull(head,"decodeUser err!",-1);

    while (1)
    {
       //mark 有待优化
        head = strpbrk(head,"@:");
        if(head ==NULL) break;
        head+=2;
        decodeUser(head);
    }
    free(data);
    return 0;
}

/*********************************************************************************
** 函数名称: userSave
** 功能描述: 保存用户
** 输入参数: None.
** 输出参数: None.
** 返回参数: .
**********************************************************************************/
void userSave(void)
{
    int i=0;
    int count = 0;
    User* user = NULL;
    char buff[1024] = {0};
    char limit[10] = {0};
    char isVip[10] = {0};
    char balance[10] = {0};
    int len = LinkList_Length(userList);
  
    isNull(userList,"userSave Err",);//判断是否为空
    Lap_DeletFile(CFG_USER_DATA_DIR"/"CFG_USER_DATA);
    lap_creatFile(CFG_USER_DATA_DIR,CFG_USER_DATA);    //强制创建文件，防止出错
    for(i=0;i<len;i++)
    {
        user = (User*)LinkList_Get(userList,i);
        // showeUserInfo(user);
        if(user!=NULL)
        {   
            LAP_Int2Str(user->isVip,isVip);
            LAP_Int2Str(user->limit,limit);
            LAP_Int2Str(user->balance,balance);
            count += LAP_StrCopy_endChar("@:",&buff[count],'\0');
            count += LAP_StrCopy_endChar(user->name,&buff[count],'\0');         buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(user->passwd,&buff[count],'\0');       buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(user->number,&buff[count],'\0');       buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(isVip,&buff[count],'\0');              buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(limit,&buff[count],'\0');              buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(balance,&buff[count],'\0');            buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(user->flight_num,&buff[count],'\0');   buff[count++] = ',';    //分割符
            count += LAP_StrCopy_endChar(user->date,&buff[count],'\0');         buff[count++] = '\n';    //分割符 

            fileWrite(CFG_USER_DATA_DIR"/"CFG_USER_DATA,buff,count);
            //printf("len:%d %s",count,buff);
            memset(buff,0,sizeof(buff));
            memset(isVip,0,sizeof(isVip));
            memset(limit,0,sizeof(limit));
            memset(balance,0,sizeof(balance));
            count =0;
        }   
    }
    
}


/*********************************************************************************
** 函数名称: userInit
** 功能描述: 用户链表初始化
** 输入参数: None.
** 输出参数: None.
** 返回参数: .
**********************************************************************************/
void userInit(void)
{
    DIR* ret = NULL;
    userList = (LinkList*) LinkList_Create();
    isNull(userList,"userInit is NULL",);//判断是否为空

    decodeUserFile(CFG_USER_DATA_DIR"/"CFG_USER_DATA);
}

/*********************************************************************************
** 函数名称: addUser
** 功能描述: 添加用户
** 输入参数: user：用户 
** 输出参数: None.
** 返回参数: 失败：NULL.
**********************************************************************************/
void addUser(User* user)
{
    LinkList_Insert(userList,user,0);
}



/*********************************************************************************
** 函数名称: getUser_byName
** 功能描述: 通过姓名 得到用户
** 输入参数: name：用户名
** 输出参数: None.
** 返回参数: 失败：NULL.
**********************************************************************************/
User* getUser_byName(char* name)
{
    int i=0;
    int len = LinkList_Length(userList);
    User* user = NULL;

    
    for(i=0;i<len;i++)
    {
        user = (User*)LinkList_Get(userList,i);
        if(user!=NULL)
        {
            if(strcmp(user->name,name)==0) return user;
        }   
    }
    
    return NULL;
}

/*********************************************************************************
** 函数名称: deleteUser
** 功能描述: 添加用户
** 输入参数: user：用户 
** 输出参数: None.
** 返回参数: 失败：NULL.
**********************************************************************************/
void deleteUser(User* user)
{
    User* temp = NULL;
    temp = LinkList_DeleteByNode(userList,user);
    isNull(temp,"deleteUser err",);
    free(temp);
    userSave(); //保存用户链表
}

/*********************************************************************************
** 函数名称: deleteUser_ByName
** 功能描述: 添加用户
** 输入参数: user：用户 
** 输出参数: None.
** 返回参数: 失败：NULL.
**********************************************************************************/
void deleteUser_ByName(char* name)
{
    User* user = NULL;
    user = getUser_byName(name);
    isNull(user,"删除用户错误！",);
    deleteUser(user);
}



/*********************************************************************************
** 函数名称: registerUser
** 功能描述: 注册用户
** 输入参数: name：用户名 passwd:密码        
** 输出参数: None.
** 返回参数: return 0:成功  其它：失败.
**********************************************************************************/
int registerUser(void)
{
    char * ret = NULL;
    User* user = NULL;
    char buff[1024]={0};
    user = (User*)calloc(sizeof(User),1);
    isNull(user,"registerUser Err！",-1);

    getScanfClear("用户名:",user->name,CFG_USER_NAME_SIZE);
    getPasswd("密码:",user->passwd,CFG_USER_PASSWD_SIZE);
    //printf("用户：%s,密码：%s\r\n",user->name,user->passwd);

     if(getUser_byName(user->name)!=NULL)
     {
         free(user);
         isNull(NULL,"用户已存在！",-1);
     }

    sprintf(user->number,"SY-%d.fly",LinkList_Length(userList));
    sprintf(buff,"%s/%s",CFG_FLY_DATA_DIR,user->number);
    Lap_DeletFile(buff);
    // printf("user->number:%s\r\n",user->number);
    addUser(user);
    currentUser = user;
    userSave(); //保存用户链表
    
    return 0;
}


/*********************************************************************************
** 函数名称: logUser
** 功能描述: 用户登录
** 输入参数: name：用户名 passwd:密码        
** 输出参数: None.
** 返回参数: return 0:成功  其它：失败.
**********************************************************************************/
int logUser(void)
{
    char name[CFG_USER_NAME_SIZE]={0};      //用户名
    char passwd[CFG_USER_PASSWD_SIZE]={0};  //登录密码
    char * ret = NULL;
    User* user = NULL;
    system("claer");
    getScanfClear("用户名:",name,CFG_USER_NAME_SIZE);
    getPasswd("密码:",passwd,CFG_USER_PASSWD_SIZE);
    printf("用户：%s,密码：%s\r\n",name,passwd);

    user = getUser_byName(name);
        isNull(user,"用户不存在！",-1);

    if(strcmp(user->passwd,passwd)!=0) 
        isNull(NULL,"密码错误",-1);

    currentUser = user;
   return 0;
}












//++++++++++++++++++++++++++ 外部调用区



void RechargeVip(User* user)
{
    int buff[10]={0};
    int data=0;
    if(user->isVip)
    {
        printf("尊敬的%s用户，你已经是VIP，无需此操作！\r\n",user->name);
        return;
    }

    getScanfClear("请输入金额(>100):",buff,10);
    data = atoi(buff);
    if (data<100)
    {
       printf("充值金额为：%d 小于100，VIP升级失败！\r\n");
       return ;
    }
    
    user->isVip = 1;
    user->balance+=data;
    userSave();
    printf("%s用户，你已成功充值：%d\r\n",user->name,data);
}


void Recharge(User* user)
{
    int buff[10]={0};
    int data=0;
    getScanfClear("请输入金额:",buff,10);
    data = atoi(buff);
    if (data<0)
    {
       printf("金额非法，充值失败！\r\n");
       return ;
    }
    user->balance+=data;
    userSave();
    printf("%s用户，你已成功充值：%d\r\n",user->name,data);
}


int chengUser(User* user)
{
    char * ret = NULL;
    User* tempuser = NULL;

    tempuser = (User*)calloc(sizeof(User),1);
    isNull(tempuser,"registerUser Err！",-1);

    getScanfClear("用户名:",tempuser->name,CFG_USER_NAME_SIZE);
    getPasswd("密码:",tempuser->passwd,CFG_USER_PASSWD_SIZE);
    //printf("用户：%s,密码：%s\r\n",user->name,user->passwd);

     if(getUser_byName(tempuser->name)!=NULL)
     {
         free(tempuser);
         isNull(NULL,"用户已存在！",-1);
     }
    
    addUser(tempuser);
    currentUser = tempuser;
    deleteUser(user);
    userSave(); //保存用户链表
    
    return 0;
}

																						 
void userTest(void)
{
    
    userInit();
    userSave();
    //logUser();
    registerUser();
    //deleteUser_ByName("王秋云");
    // isNull(currentUser,"当前无登录用户",);
    // showeUserInfo(currentUser);
    // while(logUser())
    // {   
        
    //     sleep(3);
    // }
}